跳到主要内容

Go 的表格驱动测试

编写测试代码时,一个较好的办法是把测试的输入数据和期望的结果写在一起组成一个数据表(table-driven tests):表中的每条记录都是一个含有输入和期望值的完整测试用例,有时还可以结合像测试名字这样的额外信息来让测试输出更多的信息。

example1:

编写一个被测的方法

func Add(a, b int) int {
return a + b
}

编写测试方法

import "testing"

func TestAdd(t *testing.T) {
type args struct {
a int
b int
}
tests := []struct {
name string // 用例名称
args args // 参数列表
want int //期望的结果
}{
{
"用例01",
args{1, 2},
3,
},
{
"用例02",
args{9, 2},
11,
},
{
"用例03",
args{9, 12},
21,
},
}

// 执行用例
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Add(tt.args.a, tt.args.b); got != tt.want {
t.Errorf("Add() = %v, want %v", got, tt.want)
}
})
}
}

所有用例的数据组织在切片 cases 中,看起来就像一张表,借助循环创建子测试。这样写的好处有:

  • 新增用例非常简单,只需给 cases 新增一条测试数据即可。
  • 测试代码可读性好,直观地能够看到每个子测试的参数和期待的返回值。
  • 用例失败时,报错信息的格式比较统一,测试报告易于阅读。

Reference

the-way-to-go_ZH_CN Golang 与子测试 Go Test 单元测试简明教程